from RegistroDeObservadores import RegistroDeObservadores
from CalculadorDePuntaje import *

from threading import Timer
import time

class PartidaDeSopaDeLetras:
	def __init__(self, unaSopaDeLetras, calculadorDePuntaje):
		self.__sopaDeLetras = unaSopaDeLetras
		self.__marcas = set()
		self.__observadores = RegistroDeObservadores()
		self.__calculadorDePuntaje = calculadorDePuntaje

	def sopaDeLetras(self):
		return self.__sopaDeLetras

	def suscribirObservador(self, observador):
		self.__observadores.suscribir(observador)

	def desuscribirObservador(self, observador):
		self.__observadores.desuscribir(observador)

	def marcar(self, marca):
		self.__marcas.add(marca)
		self.__observadores.notificar("nuevaMarca",marca)

	def iniciar(self):
		self.__tiempoActual = 0
		self.__tiempoDeInicio = time.time()
		self.__actualizarReloj()

	def terminar(self):
		self.__timer.cancel()
		self.__verificarMarcas()

	def palabrasABuscar(self):
		return self.__sopaDeLetras.palabrasABuscar()

	def __verificarMarcas(self):
		marcasCorrectas = self.__sopaDeLetras.sonMarcasCorrectas(self.__marcas)
		marcasIncorrectas = self.__marcas - marcasCorrectas
		puntaje = self.__calculadorDePuntaje.calcularPuntaje(marcasCorrectas, marcasIncorrectas, self.__tiempoActual)
		self.__observadores.notificar("resultados", marcasCorrectas, marcasIncorrectas, puntaje)

	def __actualizarReloj(self):
		self.__tiempoActual = int(time.time() - self.__tiempoDeInicio)
		self.__observadores.notificar("actualizarReloj", self.__tiempoActual)
		self.__timer = Timer(1, self.__actualizarReloj)
		self.__timer.start()
